// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_TORQUE_SERVER_DATA_H_
#define V8_TORQUE_SERVER_DATA_H_

#include <map>
#include <vector>

#include "src/base/macros.h"
#include "src/base/optional.h"
#include "src/torque/source-positions.h"

namespace v8 {
namespace internal {
    namespace torque {

        // The definition of the token in the first element, can be found at the second.
        using DefinitionMapping = std::pair<SourcePosition, SourcePosition>;
        // TODO(szuend): Support overlapping source positions when we start adding them.
        using Definitions = std::vector<DefinitionMapping>;
        using DefinitionsMap = std::map<SourceId, Definitions>;

        // This contextual class holds all the necessary data to answer incoming
        // LSP requests. It is reset for each compilation step and all information
        // is calculated eagerly during compilation.
        class LanguageServerData : public ContextualClass<LanguageServerData> {
        public:
            LanguageServerData() = default;

            V8_EXPORT_PRIVATE static void AddDefinition(SourcePosition token,
                SourcePosition definition);

            V8_EXPORT_PRIVATE static base::Optional<SourcePosition> FindDefinition(
                SourceId source, LineAndColumn pos);

        private:
            DefinitionsMap definitions_map_;
        };

    } // namespace torque
} // namespace internal
} // namespace v8

#endif // V8_TORQUE_SERVER_DATA_H_
